﻿#define _CRT_SECURE_NO_WARNINGS
//
//struct
//{
//	int a;
//	char b;
//	float c;
//}x;
//struct
//{
//	int a;
//	char b;
//	float c;
//}*p;
//p = &x;//err
////数据结构：描述的是数据在内存中的存储和组织结构
////顺序表和链表——线性数据结构
//
////定义节点
//struct Node
//{
//	int data;
//	//struct Node next;//err 会造成无限循环
//	struct Node* next;//存放下一个节点的地址
//};

#include<stdio.h>

//struct s1//8字节
//{
//	char c1;
//	char c2;
//	int i;
//};
//struct s2//大小是12字节
//{//对齐数：类型大小与8比，较小的那一个      
//	char c1;//1与8  1  对齐偏移量为0的位置
//	int i;//4与8    4  对齐4的整数倍
//	char c2;//1与8  1  对齐1的整数倍
//};
////s2的总⼤⼩为最⼤对⻬数整数倍
////（1、4、1中最大的为4，4的整数倍）
//// 9不是4的倍数，往下数，所以是12
//struct S3//16   
//{
//	double d;//8
//	char c;//1
//	int i;//4
//};
//
//struct S4//S4的大小：32字节
//{       //     对齐数选择：
//	char c1;//     1与8取  1
//	struct S3 s3;//16与8取 8
//	double d;//    8与8取  8
//};
////判断：S4的大小 是否为 最大对齐数 的整数倍
//// 32是8的整数倍，所以32确定是S4的大小
//
////offsetof-计算结构体成员相较于起始位置的偏移量
//#include<stddef.h>
//int main()
//{
//	struct s1 a = { 0 };
//	struct s2 b = { 0 };
//
//	printf("%zd\n", sizeof(struct s1));
//	printf("%zd\n", sizeof(struct s2));
//	printf("%zd\n", offsetof(struct s2,c1));
//	printf("%zd\n", offsetof(struct s2,i));
//	printf("%zd\n", offsetof(struct s2,c2));
//
//	return 0;
//}
//#pragma pack(1)//设置对齐数为1
//struct s1//6字节
//{
//	char c1;
//	char c2;
//	int i;
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct s1));
//
//	return 0;
//}

////结构体传参
//struct S
//{
//	int data[1000];
//	int num;
//};
//void print1(struct S t)
//{
//	printf("%d %d\n", t.data[0], t.num);
//}
// //加上const限制*ps,更安全
//void print2(const struct S* ps)
//{
//	printf("%d %d\n", ps->data[0], ps->num);
//}
//
//int main()
//{
//	struct S s = { {1,2,3,4,5},100 };
//	print1(s);
//	print2(&s);
//	return 0;
//}
//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//int main()
//{
//	printf("%d", sizeof(struct A));
//	return 0;
//}
//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//}

//union u
//{
//	char c;
//	int u;
//};
//int main()
//{
//	union u uu;
//	printf("%zd\n", sizeof(uu));
//	printf("%p\n", &uu);
//	printf("%p\n", &(uu.c));
//	printf("%p\n", &(uu.u));
//}
#include <stdio.h>
union Un1
{//         对齐数：
	char c[5];//1与8  1
	int i;//4与8      4
	//最大对齐数是4
};//5为Un1的大小？
//判断：5不是4的倍数，应该取8，
//所以8字节是Un1的大小


//struct gift_list
//{
//	int stock_number;//库存量 
//	double price; //定价 
//	int item_type;//商品类型 
//
//	union {
//		struct
//		{
//			char title[20];//书名 
//			char author[20];//作者 
//			int num_pages;//⻚数 
//		}book;
//		struct
//		{
//			char design[30];//设计 
//		}mug;
//		struct
//		{
//			char design[30];//设计 
//			int colors;//颜⾊ 
//			int sizes;//尺⼨ 
//		}shirt;
//	}item;
//};

//struct gift_list
//{
//	//公共属性 
//	int stock_number;//库存量 
//	double price; //定价 
//	int item_type;//商品类型 
//
//	//特殊属性 
//	char title[20];//书名 
//	int num_pages;//⻚数 
//
//	char design[30];//设计 
//	int colors;//颜⾊ 
//	int sizes;//尺⼨ 
//};

//union U
//{
//	int n;
//	struct S
//	{
//		char c1;
//		char c2;
//		char c3;
//		char c4;
//	}s;
//};
//int main()
//{
//	//int n = 0x11223344;
//	union U u = { 0 };
//	u.n = 0x11223344;
//	//将n逐个字节取出
//	printf("%x %x %x %x\n", u.s.c1, u.s.c2, u.s.c3, u.s.c4);
//	//%x十进制打印
//	return 0;
//}

//int check_sys()
//{
//	union //匿名联合体
//	{
//		char c;
//		int i;
//	}u;
//	u.i = 1;//共4个字节
//	return u.c;//返回第1个字节的位置
//}
//
//int main()
//{
//	int ret = check_sys();
//	if (ret == 1)
//		printf("小端\n");
//	else
//		printf("大端\n");
//	return 0;
//}

enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};
int main()
{
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);
	return 0;
}